﻿#!/usr/bin/perl -w

# exemple script insertion CNV en base

use Bio::DB::SeqFeature::Store;	#module pour ce connecter a la base gbrowse de se connection
use DBI;	#module pour ce connecter a toute la base de données

# Récupération des paramètres
$iddossier= $ARGV[0];
# $puce = $ARGV[1];
$idpuce = $ARGV[1];
$chrom = $ARGV[2];
$cnvstart = $ARGV[3];
$cnvstop = $ARGV[4];
$nbcopie = $ARGV[5];
$log2ratio = $ARGV[6];
$namespace = $ARGV[7];
$sondedebut = $ARGV[8];
$sondefin= $ARGV[9];
$verifie = $ARGV[10];
$methodeverification = $ARGV[11];
$herite = $ARGV[12];
$commentaire = $ARGV[13];
$classification = $ARGV[14];
$clef = $ARGV[15];




$trouve = 1;

if($methodeverification == 0){
	$methodeverification = "PAS DE VERIFICATION"; 
}elsif($methodeverification == 1){
	$methodeverification = "FISH";
}elsif($methodeverification == 2){
	$methodeverification = "qPCR";
}elsif($methodeverification == 3){
	$methodeverification = "FISH+qPCR";
}elsif($methodeverification == 4){
	$methodeverification = "CARYOTYPE";
}

if($verifie == 1){
	$verifie = "VERIFICATION NON REALISEE";
}elsif($verifie == 2){
	$verifie = "CNV NON RETROUVE PAR UNE AUTRE METHODE";
}elsif($verifie == 3){
	$verifie = "CNV RETROUVE PAR UNE AUTRE METHODE";
}




if($herite == 1){
	$herite = "NON VERIFIE";
}elsif($herite == 2){
	$herite = "DE NOVO";
}elsif($herite == 3){
	$herite = "2 PARTENTS PORTEURS"; 
}elsif($herite == 4){
	$herite = "MERE PORTEUSE/PERE NON PORTEUR"; 
}elsif($herite == 5){
	$herite = "MERE PORTEUSE/PERE NON VERIFIE";
}elsif($herite == 6){
	$herite = "PERE PORTEUR/MERE NON PORTEUSE";
}elsif($herite == 7){
	$herite = "PERE PORTEUR/MERE NON VERIFIEE";
}elsif($herite == 8){
	$herite = "AUTRE";
}


if($classification == 1){
	$classification = "NON CLASSE";
}elsif($classification == 2){
	$classification = "POLYMORPHISME";
}elsif($classification == 3){
	$classification = "PROBABLEMENT BENIN";
}elsif($classification == 4){
	$classification = "PREDISPOSITION/PENETRANCE INCOMPLETE";
}elsif($classification == 5){
	$classification = "PATHOLOGIQUE"; 
}elsif($classification == 6){
	$classification = "INDETERMINE"; 
}

# Open the feature database
$db = Bio::DB::SeqFeature::Store->new( -adaptor => 'DBI::mysql',
					-namespace => $namespace,
					-dsn     => 'dbi:mysql:base_hg',
					-user	 => 'root',
					-pass	 => 'mysql');

# on recherche les CNV sur cette localisation de génome
@feature = $db->features(	-seqid	=> 'chr'.$chrom,
							-start	=>$cnvstart,
							-end	=>$cnvstop,
							-types	=> 'CNV',
							-range_type => 'contains',
							-attributes	=> {
								nbcopie=>$nbcopie,
								classification=>$classification}
							);

# récupération de la ou les cytoband correspondant au coordonnées du CNV
my @CytogeneticBand = $db->features(-seqid=>'chr'.$chrom,-start=>$cnvstart,-end=>$cnvstop,-types=>'cytoband');
my $NameCytogenetic;
foreach my $cytob(@CytogeneticBand) { 
	my @tempcyto = $cytob->attributes('Alias');
	$NameCytogenetic .= "@tempcyto, " ;
}

	my @temp;						
# Si une ou plusieurs anomalies sont présentes a l'intérieur des deux bornes
if(@feature!=0){
	# Connexion à la base de données MySQL
	my $dbh = DBI->connect( "dbi:mysql:dbname=bdacpa;host=localhost;", 'root', 'mysql' ) or die "Connexion impossible à la base de données !\n"; 
	# pour chaque anomalie présente
	foreach my $feat(@feature){
		my $sta = $feat->start;
		my $end = $feat->end;
		# on regarde si les bornes sont exactes, ce qui veut dire qu'elle est trouvé
		if (($sta == $cnvstart)&&( $end == $cnvstop)) {
			my @ligne_cnv;
			my $row;
                        my $valtest;
                        my @temp = $feat->attributes("Repetition");		
			my $id_feat = $feat->primary_id();
			# on regarde si le patient est déjà en lien avec cette anomalie
			my $prep = $dbh->prepare("SELECT * FROM cnv_$namespace WHERE cnv_$namespace.idpuce = $idpuce AND cnv_$namespace.idcnv = $id_feat") or die $dbh->errstr;

			$prep->execute() or die "Echec requête"; 
			
			while (($row) = $prep->fetchrow_array ) { 
				push(@ligne_cnv, $row );
            		} 
			$prep->finish();
         
			#si l'anomalie est déjà associée à ce patient, on n'effectue aucun ajout
			if(@ligne_cnv!=0){
                        	my $valtest = 2;
			  	#print "1".$feat->name; # c'est le 1 qui est important
                          	print "$valtest".$feat->primary_id();
			}else{
				$valtest = 1;
				$temp[0] = $temp[0] + 1;
				$feat->remove_tag('Repetition');
				$feat->add_tag_value('Repetition',$temp[0]);
				$db->store($feat) or die "Couldn't update!\n";
				 print "$valtest".$feat->primary_id();
			}
			$trouve = 0;
			last;
		}
	}
}

# si le cnv n'a pas été trouvé, c'est qu'il n'existe pas ...
if (($trouve==1)&&($clef!=-1)){
	# la clef permet d'obtenir un nom unique a partir des la clef primaire de HG18, afin de pouvoir rechercher l'anomaly indifférement dans les versions de genomes

	my $feature = $db->new_feature(	-seq_id	=> 'chr'.$chrom,
					-start	=> $cnvstart,
					-end	=> $cnvstop,
					-display_name	=>'CNV_'.$clef,
					-primary_tag	=> 'CNV',
					-dossier => $iddossier,
					-score	=> '.',
					-desc	=> '',
					-strand	=> '.',
					-phase	=> '.',
					-attributes	=> {	nbcopie=>$nbcopie,
								Cytoband=>$NameCytogenetic,
								log2ratio=>$log2ratio,
								Genome=>$namespace,
								sondedebut=>$sondedebut,
								sondefin=>$sondefin,
								verifie=>$verifie,
								methodeverification=>$methodeverification ,
								herite=>$herite,
								commentaire=>$commentaire,
								classification=>$classification,
								Repetition => 1});
													
	print "0".$feature->primary_id();
}elsif ($trouve==1) {
	my $feature = $db->new_feature(	-seq_id	=> 'chr'.$chrom,
					-start	=> $cnvstart,
					-end	=> $cnvstop,
					-display_name	=>'CNV',
					-primary_tag	=> 'CNV',
					-dossier	=> $iddossier,
					-score	=> '.',
					-desc	=> '',
					-strand	=> '.',
					-phase	=> '.',
					-attributes	=> 	{
						nbcopie=>$nbcopie,
						Cytoband=>$NameCytogenetic,
						log2ratio=>$log2ratio,
						Genome=>$namespace,
						sondedebut=>$sondedebut,
						sondefin=>$sondefin,
						verifie=>$verifie,
						methodeverification=>$methodeverification ,
						herite=>$herite,
						commentaire=>$commentaire,
						classification=>$classification,	
						Repetition => 1}
					);
														

	$feature->name('CNV_'.$feature->primary_id());
	$db->store($feature) or die "Couldn't update!\n";	
	# on retourne 0 pour dire que c'est un ajout, et on retourne l'identifiant
	print "0".$feature->primary_id();
	
}
